import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;


public class Grille {
	private Case[][] grilleSudoku = new Case[9][9];
	private int cellule=0;
	private String path;
	private boolean grilleResolue=false;
	
	public Grille(String path){
		
		this.path=path;
		lireGrille();
	}
	
	public void execute(){
				
		resoudreGrille(cellule);
		
		afficherGrille();
		
	}
	public void lireGrille(){
		
		try{
			
			InputStream ips=new FileInputStream(path); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne=null;
			
			for (int i=0;(ligne=br.readLine())!=null&&i<9;i++){
				System.out.println();
				for(int j=0;j<9;j++){
					if(Integer.parseInt(ligne.substring(j, j+1))== 0){
						grilleSudoku[i][j]=new Case(Integer.parseInt(ligne.substring(j, j+1)),false);	
					}else{
						grilleSudoku[i][j]=new Case(Integer.parseInt(ligne.substring(j, j+1)),true);
					}
					System.out.print(grilleSudoku[i][j].getNumero());
					
				}
			}		
			
			br.close(); 
			System.out.println();
		}		
		
		catch (Exception e){
			
			System.out.println(e.toString());
		}		
		
	}
	public boolean resoudreGrille(int cellule){
		
		if (cellule==81){
			
			grilleResolue=true;
			return true;
			
		}
		
		int ligne=cellule/9, colonne=cellule%9;
		
		if(grilleSudoku[ligne][colonne].isFinal()==true)
			return resoudreGrille(cellule+1);
		
		for(int chiffre=1;chiffre<=9;chiffre++)
			
		{
			
			if(estValide(ligne,colonne,chiffre))
				
			{
				
				grilleSudoku[ligne][colonne].setNumero(chiffre);
				
				if(resoudreGrille(cellule+1))
					
					return true;
				
			}		
			
		}		
		
		grilleSudoku[ligne][colonne].setNumero(0);
			
		return false;
		
	}
	
	public void afficherGrille(){		
		
		if(!grilleResolue)
			
			System.out.println("\nCette grille n'a pas de solution!");
		
		else {
			System.out.println("\n\nGrille resolue");
			for (int i=0;i<9;i++){
				
				System.out.println();
				
				for(int j=0;j<9;j++){
					
					System.out.print(grilleSudoku[i][j].getNumero());
					
				}
			}		
		}
	
	}
	
	public boolean estValide(int ligne, int colonne, int chiffre) {
		
		for(int i=0;i<9;i++){
			
			if(chiffre==grilleSudoku[ligne][i].getNumero())
				return false;
		}	
		
		for(int j=0;j<9;j++){
			
			if(chiffre==grilleSudoku[j][colonne].getNumero())
				return false;
		}
		
		for(int i=(ligne/3)*3;i<(ligne/3)*3+3;i++){
			
			for(int j=(colonne/3)*3;j<(colonne/3)*3+3;j++){
				
				if(chiffre==grilleSudoku[i][j].getNumero())
					return false;
				
			}
		}
		return true;		
		
	}
}
